package com.shujia

import java.util

object Code43Match {
  def main(args: Array[String]): Unit = {
    /**
     * 模式匹配：
     * ① 对于没有匹配到值 那么都会报错 scala.MatchError
     * ② _ 表示任意值，一般存放在 match 的末尾 表示以上都没有匹配到 则运行对应代码块
     * ③ match 可以有返回结果，在每一个代码块中，以最后一行作为其 返回值，并且要求其返回值类型一致
     * ④ 在做值匹配时，要求case 后的数据类型和要匹配的数据类型一致
     * ⑤ 对于获取到的数据，可以匹配到其类型
     *
     */


    val int: Int = 100

    val res = int match {
      case 10 => {
        println("匹配到值为10")
        11
      }
      case 100 => {
        println("匹配到值为100")
        101
      }
      case 1000 => {
        println("匹配到值为1000")
        1001
      }
      case _ => {
        println("没有匹配到任何内容")
        1
      }
    }
    println("res:" + res)


    val str: String = "A"
    str match {
      case "A" => println("匹配到A")
      case "B" => println("匹配到B")
      case _ => println("未匹配到任何值")
    }


    val any: Any = "any"
    any match {
      case str: String => println("匹配到类型String")
      case int: Int => println("匹配到类型Int")
      case long: Long => println("匹配到类型Long")
      case _ => println("匹配到类型Any")
    }


    val map: Map[String, Int] = Map(("key1", 1), ("key2", 2))
    map.get("key3") match {
      case None => println("未获取其值")
      case Some(value) => println("获取到值：" + value)
    }

    //    map.getOrElse()

    //    枚举enum
    val monday: WeekElem.Value = WeekElem.Monday
    monday match {
      case WeekElem.Monday => println("上课")
      case WeekElem.Tuesday => println("上课")
      case WeekElem.Wednesday => println("自习")
      case WeekElem.Thursday => println("上课")
      case WeekElem.Friday => println("上课")
      case WeekElem.Saturday => println("上课")
      case WeekElem.Sunday => println("休息")
    }


    // 样例类的对象

    /**
     * 很重要：
     * case Data(c1,c2,c3) => {  该方式使用 match 先匹配类型，再从类型中相对应位置获取到变量值
     */


    val data: Data = Data("1001", "周一", "上课")
    data match {
      case Data(c1, c2, c3) => {
        // 将对象中的属性取出
        println(s"获取到Data中的数据：$c1,$c2,$c3")
      }
      case _ => {
        println("没有匹配到任何数据")
      }
    }

    // 对应类型一致时，获取其属性
    data match {
      case data: Data => {
        // 将对象中的属性取出
        println(s"获取到Data中的数据：${data.colum1},${data.colum2},${data.colum3}")
      }
      case _ => {
        println("没有匹配到任何数据")
      }
    }

    // 可以对类的属性进行比较
    data match {
      case Data("1001", "周一", "上课") => println("匹配到的周一对象相等...")
      case Data("1002", "周二", "上课") => println("匹配到的周二对象相等...")
      case _ => println("未匹配到任何相等的对象")
    }

  }
}

// 普通类没有重写 equals 方法
class MatchStu(_name: String) {
  var name: String = _name
}

class MatchStu2(_name: String) {
  var name: String = _name
}

// 样例类重写了其比较的方法 equals
case class Data(colum1: String, colum2: String, colum3: String)


object WeekElem extends Enumeration {
  val Monday: Value = Value(1)
  val Tuesday: Value = Value(2)
  val Wednesday: Value = Value(3)
  val Thursday: Value = Value(4)
  val Friday: Value = Value(5)
  val Saturday: Value = Value(6)
  val Sunday: Value = Value(7)

  //  val Monday = Value(1)
  //  val Tuesday = Value(2)
  //  val Wednesday = Value(3)
  //  val Thursday = Value(4)
  //  val Friday = Value(5)
  //  val Saturday = Value(6)
  //  val Sunday = Value(7)
}
